//move-to-front
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#include "mtf.h"
#include "../myTypes.h"

#define DEFAULT_LENGHT 256 //taille du tableau
byte Tab[DEFAULT_LENGHT];  //tableau de caractères initial


//-----------------------------------------------------------------------------
void MTF_init()
//-----------------------------------------------------------------------------
{
	int i;
	for (i =0; i<DEFAULT_LENGHT; i++)	Tab[i]=i;
}


//-----------------------------------------------------------------------------
void afficheTab(byte T[], int n)
//-----------------------------------------------------------------------------
{
	int i;
	printf("{");
	for (i=0;i<n;i++)
	{printf("%02X",T[i]);
	if (i<n-1){printf(",");}
	}
	printf("}\n");
}



//-----------------------------------------------------------------------------
void MTF_encode(bitbuf_t * dst, bitbuf_t * src)
//-----------------------------------------------------------------------------
//fonction d'encodage d'un buffer
{
	int i,k;

	//bit_seek(src, 0,0,BITSEEK_SET); //initialisation du curseur de lecture
	//bit_seek(dst, 0,0,BITSEEK_SET); //initialisation du curseur de lecture


	bloc_t c;
	for (i = 0; i< src->len/8; i++)
	{
		//parcours des caractères du buffer src
		c= src->data[i];

		int j=0;
		while ((c!=Tab[j])&&(j<DEFAULT_LENGHT)) {j++;} //recherche du caractère dans le tableau

		dst->data[i]= (byte)j;

		byte temp = Tab[0];
		Tab[0]=Tab[j];
		for (k=1;k<=j;k++)
		{
			byte temp2=Tab[k];
			Tab[k]=temp;
			temp=temp2;
		}
	}
	//afficheTab(Tab,256);
}

//-----------------------------------------------------------------------------
void MTF_decode(bitbuf_t * dst, bitbuf_t * src)
//-----------------------------------------------------------------------------
//fonction de décodage d'un buffer
{
	int i,k;

	bloc_t c;

	for (i=0; i<src->len/8;i++)
	{
		c = src->data[i];
		dst->data[i] = Tab[c];

		//déplacement du caractere en position 0
		byte temp = Tab[0];
		Tab[0]=Tab[c];

		//décalage de tous les autres
		for (k=1;k<=c;k++)
		{
			byte temp2=Tab[k];
			Tab[k]=temp;
			temp=temp2;
		}
	}
	//afficheTab(Tab,256);
}



/*
int main() {


int i;

	int bufLen = 8;
	bitbuf_t src, dst;

	//initialisation des buffers
	bit_initBuf(&src,bufLen*8);
	bit_initBuf(&dst,bufLen*8);

    src.data="pppmsyyu";
 bit_print(&src);
    MTF_encode(&dst,&src);

    bit_print(&dst);
 //   for (i =0; i< dst.len/8; i++){printf(" 0x%02X",dst.data[i]);}

    bitbuf_t decode;
    bit_initBuf(&decode,bufLen*8);

    MTF_decode(&decode,&dst);

    printf("décodage: \n");
    bit_print(&decode);



}*/

